//交通灯
//LED灯做为红绿灯指示，数码管显示相应时间变化
//头文件
#include <reg51.h>
#include <intrins.h>


sbit SPK=P3^4;    	//SPK定义为P1口的第2位，就是驱动蜂鸣器的那个脚
/********************/		
sbit LHJ_A = P1^0;	//管脚定义 74HC138（3-8）译码器输入控制信号线
sbit LHJ_B = P1^1;
sbit LHJ_C = P1^2;
/********************/	 //宏定义 	,定义数码管显示第几位
#define 	SMG7 	LHJ_C=1;LHJ_B=1;LHJ_A=0			//译码器的输入脚，全0选择第一位数码管。
#define 	SMG8 	LHJ_C=1;LHJ_B=1;LHJ_A=1			//译码器的输入脚，001选择第二位数码管。


sbit N_R=P0^7;
sbit N_Y=P0^6;
sbit N_G=P0^5;
sbit E_R=P0^4;
sbit F_R=P0^3;
sbit S_G=P0^2;
sbit S_Y=P0^1;
sbit S_R=P0^0;

code unsigned char table[]=
			{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
			0x40};
			//共阴数码管 0-9

unsigned int tt=0;
char timerc=2;
unsigned char timer=0;//定义数组变量

void delay();//延时子函数，5个空指令
void display(unsigned char date);//数字的显示函数；lp为指向数组的地址，lc为显示的个数
													//这个函数在第二节用过不用再说了吧！


void main(void)     //入口函数
{
	unsigned char i=0,j=0;
	TMOD=0x01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;	
	EA=1;
	ET0=1;	
	TR0=1;

	while(1){
	P0=0xff;
	//---------------------------
		N_R=0; S_G=0;           /*东西红灯亮，南北绿灯亮 */ 
	
		timerc=31;
 	    while(timerc>=0)            /* 循环20次，延时20秒 */
        {
			timer=timerc/2;
			if(timerc<6){
				N_R=timerc&0x01; S_G=N_R;				
			}
			
			display(timer);
        }
		N_R=1;S_G=1;
		//--------------------------	
		N_Y=0;S_Y=0;
		timerc=5;
 	    while(timerc>=0)            /* 循环3次，延时3秒 */
        {
			timer=timerc/2;
			
			display(timer);
        }
		N_Y=1;S_Y=1;
	
		//---------------------------		
		N_G=0;S_R=0;
	
		timerc=31;
 	    while(timerc>=0)            /* 循环20次，延时20秒 */
        {
			timer=timerc/2;
			if(timerc<6){
				S_R=timerc&0x01; N_G=S_R;				
			}
			
			display(timer);
        }
		N_G=1;S_R=1;
		//--------------------------		
		N_Y=0;S_Y=0;
		timerc=5;
 	    while(timerc>=0)            /* 循环3次，延时3秒 */
        {
			timer=timerc/2;
		
			display(timer);
        }
		N_Y=1;S_Y=1;
		N_R=1;S_R=1;
		//---------------------------
	}
}

void display(unsigned char date)//显示
{
	P2=0xff;					//
	SMG7;		//
	P2=table[date/10];		//查表法得到要显示数字的数码段
	delay();				//延时5个空指令	
	P2=0;					//清0端口，准备显示下位	
	
	SMG8;
	P2=table[date%10];		//查表法得到要显示数字的数码段
	delay();				//延时5个空指令	
	P2=0;					//清0端口，准备显示下位
	
				
}
void time0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	tt++;
	if(tt==10){
		tt=0;
		timerc--;
	}
}

void delay(void)								//空5个指令
{
	unsigned char i=50;
	while(i--);
} 
